package NEGOCIOS;

import BD.PersonFactory;
import BD.Proceso;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class ControlProceso {
    
    //Declaracion de variables globales
    private SessionFactory sessionFactory = null;

    //Metodo para crear la session nesesaria para interactuar con la DB
    private Session createSession() {
        Session session = null;
        try {
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
        } catch (HibernateException he) {
            JOptionPane.showMessageDialog(null, "Error: " + he, "Error ocurrido"
                    + " en el control de Proceso", 0);
            session.close();
        }
        return session;
    }

    //Metodo que devuelve un proceso en especifico
    public Proceso seleccionarUno(int id) {
        //Crear objeto nesesaro para obtener la informacion de la DB
        Proceso proceso = null;
        //Crear session
        Session session = createSession();
        try {
            
            //Obtener proceso de la BD
            proceso = (Proceso) session.createQuery("from Proceso"
                    + " where id=" + id).list().get(0);
            //Si todo sale bien cierro session
            session.close();
        } catch (Exception ex) {
            //Si algo sale mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                   "Error ocurrido al obtener el Proceso solicitado.",
                   0);
            session.close();
        }
        //Regresar el objeto obtenido
        return proceso;
    }

    //Metodo que debuelve una lista con todos los procesos guardados en la DB
    public List seleccionarTodosLosProcesos() {
        //Crear la lista que contrendra todos los procesos
        List procesos = null;
        //Crear la session
        Session session = createSession();
        try {
            //Obtener todos los procesos guardados en la BD
            procesos = session.createQuery("from Proceso").list();
            //Si todo salio bien cierro session
            session.close();
        } catch (Exception ex) {
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al obtener los Procesos.", 0);
            session.close();
        }
        
        //Regresar la lista generada
        return procesos;
    }

    //Metodo para guardar en la base de datos los nuevos procesos realizados
    public void agregarProceso(String modelo, int cantidad, String colorytipohilo) {
        //Crear la session nesesaria
        Session session = createSession();
        try {
            //Crear la transaccion
            Transaction transaccion = session.beginTransaction();

            //Crear el objeto que se guardara en la base de datos
            Proceso proceso = new Proceso();

            //iniciar transaccion
            transaccion.begin();

            //Colocar los valores deceados
            proceso.setModelo(modelo);
            proceso.setCantidad(cantidad);
            proceso.setColorYTipoHilo(colorytipohilo);

            //Guardar en la base de datos
            session.saveOrUpdate(proceso);

            //Si todo salio bien ejecutamos la transaccion y cierro session
            transaccion.commit();
            session.close();
        } catch (Exception ex) {
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al guardar el proceso.", 0);
            session.close();
        }
    }
    
    //Metodo para guardar objetos ya formados
    public void agregarProcesoPorObjeto(Proceso proceso){
        //Crear la session nesesaria
        Session session = createSession();
        try {
            //Crear la transaccion
            Transaction transaccion = session.beginTransaction();

            //iniciar transaccion
            transaccion.begin();

            //Guardar en la base de datos
            session.saveOrUpdate(proceso);
            session.refresh(proceso);

            //Si todo salio bien ejecutamos la transaccion y cierro session
            transaccion.commit();
            session.close();
        } catch (Exception ex) {
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al guardar el proceso.", 0);
            session.close();
        }
    }
    //Metodo para actualizar procesos guardados en la DB
    public void actualizarProceso(int id, String modelo, int cantidad, String colorytipohilo){
        //Crear la session nesesaria
        Session session = createSession();
        try{
            //Cargar el objeto que se quiere modificar
            Proceso proceso = seleccionarUno(id);
            
            //Crear la transaccion
            Transaction transaccion = session.beginTransaction();
            transaccion.begin();
            
            //Modificar el objeto con los nuevos valores de las variables
            proceso.setId(id);
            proceso.setModelo(modelo);
            proceso.setCantidad(cantidad);
            proceso.setColorYTipoHilo(colorytipohilo);
            
            //Guardar el objeto modificado
            session.save(proceso);
            transaccion.commit();
            
            //si todo salio bien cerrar session
            session.close();
        }catch(Exception ex){
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al actualizar el proceso.", 0);
            session.close();
        }
    }
    
    //Metodo que elimina un proceso en espesifico
    public void eliminarProceso(Proceso proceso){
        //Crear session
        Session session = createSession();
        try{
            //Crear transaccion
            Transaction transaccion = session.beginTransaction();
            transaccion.begin();
            
            //Borrar el proceso
            session.delete(proceso);
            //Si todo salio bien terminar transaccion y cerrar session
            transaccion.commit();
            session.close();
        }catch(Exception ex){
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al eliminar el proceso.", 0);
            session.close();
        }
    }
    
    //Metodo para grardar una lista de procesos
    public void agregarVariosProcesos(List<Proceso> procesos){
        for(int i=0;i<procesos.size();i++){
            agregarProcesoPorObjeto(procesos.get(i));
        }
    }
}
